<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
</head>

<body>
  <script>
    function Person(name) {
      this.name = name;
    }

    Person.prototype.sayHello = function () {
      console.log(`Hello, my name is ${this.name}`);
    };

    function Student(name, major) {
      Person.call(this, name);
      this.major = major;
    }

    Student.prototype = Object.create(Person.prototype);
    Student.prototype.constructor = Student;
    Student.prototype.sayMajor = function () {
      console.log(`My major is ${this.major}`);
    };

    const john = new Student("John", "Computer Science");
// 1.请解释这段代码的作用。
//    这段代码定义了两个构造函数 Person 和 Student，并使用原型继承的方式将 Student 继承自 Person。
//    Person 构造函数接受一个参数 name，并将其赋值给实例对象的 name 属性。
//    Person 原型对象上定义了一个 sayHello 方法，用于输出实例对象的 name 属性。
//    Student 构造函数接受两个参数 name 和 major，并在调用 Person 构造函数时传入 name 参数，以初始化实例对象的 name 属性。
//    Student 原型对象通过 Object.create 方法继承自 Person 原型对象，并添加了一个 sayMajor 方法，用于输出实例对象的 major 属性。

// 2.john能够调用哪些方法？
//   john 实例对象能够调用 sayHello 和 sayMajor 方法。

// 3.如果我们在Student的原型对象上添加一个名为sayHello的方法，会发生什么？
//   如果在 Student 的原型对象上添加一个名为 sayHello 的方法，那么该方法会覆盖 Person 原型对象上的 sayHello 方法。
//   在调用 john.sayHello() 时，会执行 Student 原型对象上的 sayHello 方法，而不是 Person 原型对象上的 sayHello 方法。
//   如果 Student 原型对象上的 sayHello 方法中没有调用 Person 原型对象上的 sayHello 方法，那么实例对象的 name 属性将无法输出。
//   如果希望在 Student 原型对象上的 sayHello 方法中调用 Person 原型对象上的 sayHello 方法，可以使用 Person.prototype.sayHello.call(this) 调用。
  </script>
</body>

</html>